iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
1

看到一篇文章在教學購物車,程式裡出現了一種長這樣||=or-equals的運算符

def current_cart
    @current_cart ||= find_cart
end

private

def find_cart
  cart = Cart.find_by(id: session[:cart_id])
end  

基於好奇心,就來查查看這是什麼碗糕了。先來玩一下
從最簡單的例子來看,得到的結果a = 1在預料之中。

a ||= 1
puts a     # a = 1

第二試
在第一行先將123給a,第二行換成456,最後得到的結果還是123

a ||= 123
a ||= 456

puts a     # a = 123

那我們將原本的值123換成nil或是false呢?

a ||= nil
a ||= 456

puts a     # a = 456

-------
a ||= true
a ||= 456

puts a     # a = true

-------

a ||= false
a ||= 456

puts a     # a = 456

從結果來看,當a = true時,結果會等於true
則換成nil或是false,最後得到結果居然是第二行的456

那我們再換成字串試試,結果依然是第一行的所給予的字串

a ||= "hello"
a ||= 1

puts a     # a = hello

這樣有更清楚||=是怎麼運作的嗎?
如果利用最簡單的講法,其實a ||= b就為a || a = b

然後從以上結果我們可以得到再回到我們current_cart
這一段寫法@current_cart ||= find_cart其實就等同於

@current_cart || @current_cart = find_cart

經過翻譯之後的結果,大概就長這樣啦!

if @current_cart.nil?
  find_cart
else
  @current_cart
end

參考連結:
Ruby/Rails Programming


上一篇
Day17 | namespace ::
下一篇
Day19 | RegExp正規表式法
系列文
從色彩繽紛到只看亂碼日子,學程式從 Ruby 出發!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言